python二进制文件读取问题(大端序和小端序存储转换) |
您所在的位置:网站首页 › 二进制文件 大端小端 › python二进制文件读取问题(大端序和小端序存储转换) |
问题描述:
我的任务是对一个二进制编码的图片文件进行读取并显示,在matlab上代码展示如下 : 123fid = fopen('20191025181135153.bin','r','ieee-be'); data = fread(fid,[2048 2049],'uint16'); imshow(uint8(data))然而在python上读取图片时一片漆黑: 最开始的python代码: 1234567891011121314151617import cv2 import numpy as np imgData = np.fromfile("20191025181135153.bin", dtype=np.uint16,count=-1) width = 2048 height = 2049 # 注意此处用resize和reshape方法的不同 imgData= np.resize(imgData,(height,width)) print(imgData.shape) # 注意只能显示uint8类型的数据,如果是uint16的数据请先转成uint8。否则图片显示会出现问题。 img = imgData.astype('uint8') # 保存图片 cv2.imwrite("something.bmp", img) cv2.imshow('img', img) cv2.waitKey() cv2.destroyAllWindows() 问题解决后来发现是图片编码问题,我拿到的图片数据是大端序存储(大端序和小端序存储具体的问题可以百度),matlab读取数据的fopen函数提供了大端序和小端序的参数,然而numpy中的np.fromfile却没有提供(我以为没有提供)。 解决的办法来了! np.fromfile虽然没有提供大小端序参数,其实却可以在dtype中设置!先看一下dtype类型参数表: 所以其实可以用字符代码去表示具体的类型,用该方法的好处是可以用>和来表示大小端序存储。改进的代码: 1imgData = np.fromfile("20191025181135153.bin", dtype='>u2',count=-1)困扰好久的问题解决! 附完整的numpy读取二进制.bin图像并使用OpenCV展示的代码: 1234567891011121314151617import cv2 import numpy as np imgData = np.fromfile("20191025181135153.bin", dtype='>u2',count=-1) width = 2048 height = 2049 # 注意此处用resize和reshape方法的不同 imgData= np.resize(imgData,(height,width)) print(imgData.shape) # 注意只能显示uint8类型的数据,如果是uint16的数据请先转成uint8。否则图片显示会出现问题。 img = imgData.astype('uint8') # 保存图片 cv2.imwrite("something.bmp", img) cv2.imshow('img', img) cv2.waitKey() cv2.destroyAllWindows() |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |